<?php
namespace app\job;

use think\facade\Db;
use think\queue\Job;

class Task
{
    /**
     * fire方法是消息队列默认调用的方法
     * @param Job $job 当前的任务对象
     * @param array $data 发布任务时自定义的数据
     */
    public function fire(Job $job, array $data)
    {
        // 执行前的检查 有些任务在到达消费者时，可能已经不再需要执行了  比如未支付订单自动过期的处理 已经支付了状态改变 无需后续处理
        $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
        if (!$isJobStillNeedToBeDone) {
            $job->delete();
            return;
        }
        $isJobDone = $this->doService($data);
        if ($isJobDone){
            $job->delete();
            echo "删除任务" . $job->attempts() . '\n';
        }else{
            if ($job->attempts() > 3){
                //重试次数达到三次 删除 或者继续处理
                $job->delete();
                echo "超时任务删除" . $job->attempts() . '\n';
            }
        }

    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array $data
     * @return bool
     */
    private function checkDatabaseToSeeIfJobNeedToBeDone(array $data) {
        //code
        return true;
    }

    /**
     * 根据消息中的数据进行实际的业务处理...
     * @param array $data
     * @return bool
     */
    private function doService(array $data)
    {
        echo '执行延时业务逻辑:' . json_encode($data) . '\n';

        return true;
    }
}
